﻿#define _CRT_SECURE_NO_WARNINGS

#include<iostream>
using namespace std;

/************ 编译器优化程度版本的不同优化程度也会有差异 *******************************/
//class A
//{
//public:
//	A(int a = 0)
//		:_a1(a)
//	{
//		cout << "A(int a)" << endl;
//	}
//	A(const A& aa)
//		:_a1(aa._a1)
//	{
//		cout << "A(const A& aa)" << endl;
//	}
//	A& operator=(const A& aa)
//	{
//		cout << "A& operator=(const A& aa)" << endl;
//		if (this != &aa)
//		{
//			_a1 = aa._a1;
//		}
//		return *this;
//	}
//	~A()
//	{
//		cout << "~A()" << endl;
//	}
//private:
//	int _a1 = 1;
//};
//void f1(A aa)
//{}
//A f2()
//{
//	A aa;
//	return aa;
//}
//int main()
//{
//	// 传值传参
//	//A aa1;   //构造
//	//f1(aa1); //拷贝构造
//	//cout << endl;
//
//	//f1(1);  //构造 + 拷贝构造 -> 优化成直接构造
//
//	//f1(A(2));
//
//	// 传值返回
//	//连续拷⻉构造+拷⻉构造->优化⼀个拷⻉构造 vs2019
//	//f2();
//
//	//A aa2 = f2();
//	
//	// ⼀个表达式中，连续拷⻉构造+赋值重载->⽆法优化
//	A aa1;
//	aa1 = f2();
//
//	return 0;
//}


/*********** new delete *********************************/

//int main()
//{
//	int* part1 = new int;       //动态申请一个int类型的空间
//	int* part2 = new int(10);   //动态申请一个int类型的空间并初始化为10
//	//cout << *part2 << endl;
//	int* part3 = new int[3] {1,2,3}; //动态申请3个int类型的空间并初始化为 1 2 3
//	//cout << *part3 << *part3+1 << *part3+2 << endl;
//	delete part1;  //用完要记得释放
//	delete part2;
//	delete part3;
//	return 0;
//}

/************ new和delete操作自定义类型 ********************/

class A
{
public:
	A(int a = 0)
		:_a(a)
	{
		cout << "A()" << this << endl;
	}
	~A()
	{
		cout << "~A()" << endl;
	}


private:
	int _a;
};

int main()
{
	/********** new跟delete关于自定义类型 *****************************/
	//A* part1 = new A(1);  //new 跟 malloc最大的区别就是new会调用构造											
	//delete part1;         //delete 跟 free 最大的区别就是delete会调用析构
	//A* part2 = (A*)malloc(sizeof(A));
	//free(part2);

	A* part = new A[5];//调用5次构造

	/**** 内置类型几乎是一样的 **************** /
	int* part3 = new int;
	int* part4 = (int*)malloc(sizeof(int));

	/** 开辟10int型 ***********/
	//int* part5 = new int[10];
	//int* part6 = (int*)malloc(sizeof(int) * 10);
	//delete part5;
	//free(part6);
	return 0;
}